/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package org.juego.endpointwebsocket.decoder;

import java.io.StringReader;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.json.Json;
import javax.json.stream.JsonParser;
import javax.websocket.DecodeException;
import javax.websocket.Decoder;
import javax.websocket.EndpointConfig;
import org.juego.endpointwebsocket.util.Evento;

/**
 * Esta clase decodifica el mensaje enviado en formato JSON enviado por el programa AJAX.
 * @author MoisesAntonio
 */
public class DecEvento implements Decoder.Text<Evento>{

    private static final Logger logger = Logger.getLogger("JuegoLogger");
    /* Guarda los pares Clave-Valor leidos del JSON */
    private Map<String,String> messageMap;
    
    @Override
    public Evento decode(String s) throws DecodeException {
        logger.log(Level.INFO, "Entra una conexión. {0}", s);
        if (willDecode(s)) {    //Si se puede decodificar, se decodifica y se devuelve el objeto correspondiente.
            String esc=messageMap.get("escenario");
            String pox=messageMap.get("posx");
            String poy=messageMap.get("posy");
            
            int es=Integer.parseInt(messageMap.get("escenario"));
            int x=Integer.parseInt(messageMap.get("posx"));
            int y=Integer.parseInt(messageMap.get("posy"));
            return new Evento(es, x, y);
        }
        logger.log(Level.INFO, "Mensaje no decodificado.");
        return new Evento(0,0,0);
    }

    @Override
    public boolean willDecode(String s) {
        logger.log(Level.INFO, "Se comprueba la decodificacion.");
        boolean decodificar=false;
        
        //Este messageMap recoge los pares clave valor del mensaje JSON
        messageMap = new HashMap<>();
        JsonParser parser = Json.createParser(new StringReader(s));
        while (parser.hasNext()) {
            if (parser.next() == JsonParser.Event.KEY_NAME) {
                String key = parser.getString();
                parser.next();
                String value = parser.getString();
                messageMap.put(key, value);
                logger.log(Level.INFO, "Mensaje recibido: {0}", key+" "+value);
            }
        }
        
        //Una vez que los tengamos todos, tomamos las claves y averiguamos si contienen las partes necesarias.
        String[] MsgKeys = {"escenario", "posx", "posy"};
        Set keys = messageMap.keySet();
        if (keys.containsAll(Arrays.asList(MsgKeys))) { //Si contienen todas las claves se decodifica.
            decodificar=true;
        }
        
        
        
        return decodificar; 
    }

    @Override
    public void init(EndpointConfig config) {   }

    @Override
    public void destroy() {    }
    
}
